package fr.lille.inria.adam.lifl.EcoGardeInventory.scrapper;

import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

import android.net.http.AndroidHttpClient;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import fr.lille.inria.adam.lifl.EcoGardeInventory.Utils.ParcelableCookie;

public class Browser implements Parcelable {
	private final String TAG = "Browser";
	public final static String USER_AGENT = "Android";// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19";

	protected AndroidHttpClient client;
	protected HttpContext clientContext;
	protected CookieStore cookieStore; //TODO: à retirer, problème de consistence avec HttpContext
     
    public Browser() {
            this.client = AndroidHttpClient.newInstance(USER_AGENT); // Le "navigateur" qui va scrapper
            this.clientContext = new BasicHttpContext(); //  c'est pour avoir un "navigateur" plus réaliste
            this.cookieStore = new BasicCookieStore();
            this.clientContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // en l'occurence, pour garder les cookies            
    }
     
    public HttpContext getContext(){
    	 return clientContext;
    }

	public void setContext(HttpContext context) {
		clientContext = context;
	}	
     
	public HttpResponse execute(HttpUriRequest request) {
		try {
			AndroidHttpClient.modifyRequestToAcceptGzipResponse(request);
			HttpResponse result = this.client.execute(request, clientContext);
			return result;
		} catch (Exception e) {
			Log.e(TAG, "error execute", e);
		}

		return null;
	}
	
	public void close() {
		this.client.close();
	}
	
	@Override
	public String toString() {
		final StringBuilder sb = new StringBuilder();
		sb.append("Browser [id=").append(String.format("%08X", hashCode()));
			
		sb.append(" cookies=[");
		final CookieStore cs = (CookieStore) clientContext.getAttribute(ClientContext.COOKIE_STORE);
		List<Cookie> cookies =  cs.getCookies();
		for (Cookie cookie : cookies) {
			sb.append("[name=").append(cookie.getName())
			.append(", value=").append(cookie.getValue())
			.append(", domain=").append(cookie.getDomain()).append("], ");
		}
		if (cookies.size()>0) sb.delete(sb.length()-2, sb.length());
		sb.append(']');
		
		return sb.toString();
	}
	

	
	
	
	// #region Parcelable implementation
	@Override
	public int describeContents() { return 0; }

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// La seule chose qui nous interresse, ce sont les cookies
		// On rends les cookies Parcelable (grace à ParcelableCookie)
		// et on les enregistre
		List<Cookie> cs = this.cookieStore.getCookies();
		ParcelableCookie[] pcs = new ParcelableCookie[cs.size()];
		int pcsIt = 0;
		for (Cookie aCookie : cs) {
			ParcelableCookie pc = new ParcelableCookie(aCookie.getName(), aCookie.getValue());
			pc.setDomain(aCookie.getDomain());
			pcs[pcsIt++] = pc;
		}
		
		dest.writeArray(pcs);
	}
	
	public static final Parcelable.Creator<Browser> CREATOR = new Parcelable.Creator<Browser>() {
		@Override
		public Browser createFromParcel(Parcel source) {
			Browser result = new Browser();
			// On recupere le tableau de Cookie
			Parcelable[] pcs = source.readParcelableArray(ParcelableCookie.class.getClassLoader());
			for (Parcelable pc : pcs) {
				result.cookieStore.addCookie((Cookie) pc);
			}
			return result;
		}

		@Override
		public Browser[] newArray(int size) { return new Browser[size]; }
	};
}
